package com.zmn.plat.persistence.interfaces.channel;

import com.zmn.plat.model.entity.channel.ChannelServProduct;
import com.zmn.plat.model.entity.product.ServProductQuery;
import com.zmn.plat.model.vo.channel.ChannelServProductVO;
import com.zmn.plat.model.vo.product.tariff.item.price.ProductServiceItemExcutePriceQueryVo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 描述: 渠道服务产品数据访问
 *
 * @author linfeng
 * @since 2019/11/12
 **/
public interface ChannelServProductDAO {

    /**
     * 描述: 根据id查询渠道服务产品表数据
     *
     * @param id 渠道服务产品表id
     * @return com.zmn.plat.model.entity.channel.ChannelServProduct
     * @author linfeng
     * @since 2019/11/12
     **/
    ChannelServProduct findById(Integer id);

    /**
     * 描述: 根据产品id 查询数据
     * *
     * * @param productId 产品id
     *
     * @return com.zmn.plat.model.entity.channel.ChannelServProduct
     * @author linfeng
     * @since 2019/11/12
     **/
    ChannelServProduct findByProductId(@Param(value = "productId") Integer productId, @Param(value = "channelId") Integer channelId);

    /**
     * 描述: 根据渠道ID和产品id集合 查询数据
     *
     * @param productIdList 产品ID集合
     * @param channelId     渠道ID
     * @return
     * @auther linfeng
     * @since 2019/11/12
     */
    List<ChannelServProduct> listByProductIdListAndChannelId(@Param("productIdList") List<Integer> productIdList,
                                                           @Param("channelId") Integer channelId);

    /**
     * 描述: 根据渠道服务产品表id集合查询渠道服务产品表数据 如ids为null则返回 new ArrayList();
     *
     * @param list 渠道服务产品表id集合
     * @return java.util.List<com.zmn.plat.model.entity.channel.ChannelServProduct>
     * @author linfeng
     * @since 2019/11/12
     **/
    List<ChannelServProduct> listByIds(@Param(value = "list") List<Integer> list);

    /**
     * 描述: 通过产品查询对象查询产品条数，渠道服务产品表数据 （产品为主体）
     *
     * @param query     产品查询对象
     * @return java.lang.Integer
     * @author linfeng
     * @since 2019/11/12
     **/
    Integer countByChannelServProductTable(@Param(value = "query") ServProductQuery query);

    /**
     * 描述: 查询渠道开通的产品
     *
     * @param channelId channelId
     * @return java.util.List<Integer>
     * @author jiafei
     * @since 2021/6/28 19:08
     */
    List<ChannelServProduct> listProductIdByChannelId(@Param("channelId") Integer channelId);

    /**
     * 描述: 查询渠道下指定服务分类产品一二级分类下的产品
     *
     * @return java.util.List<com.zmn.plat.model.vo.channel.ChannelServProductVO>
     * @author linfeng
     * @since 2019/11/12
     **/
    List<ChannelServProductVO> listProductByPriceQuery(ProductServiceItemExcutePriceQueryVo vo);
    /**
     * 描述: 新增渠道服务产品数据 注意channelServProductId为必传，否则抛出 NullPointerException();
     *
     * @param channelServProduct 渠道服务产品数据
     * @author linfeng
     * @since 2019/11/12
     **/
    void updateChannelServProduct(ChannelServProduct channelServProduct);

    /**
     * 描述: 修改渠道服务产品数据
     *
     * @param channelServProduct 渠道服务产品数据
     * @author linfeng
     * @since 2019/11/12
     **/
    void updateChannelServProductByProductId(ChannelServProduct channelServProduct);

    /**
     * 描述: 根据产品ID和渠道ID修改渠道服务产品表状态
     *
     * @param productIdHave 需要修改的产品ID集合
     * @param status        状态
     * @param channelId     渠道ID
     * @param realName      修改人
     * @param updateTime    修改时间
     * @return
     * @auther linfeng
     * @since 2019/11/12
     */
    void updateStatusByProductIdListAndChannelId(@Param("productIdList") List<Integer> productIdHave, @Param("status") int status, @Param(
            "channelId") int channelId, @Param("updater") String realName, @Param("updateTime") Date updateTime);

    /**
     * 描述: 新增渠道服务产品数据
     *
     * @param channelServProduct 渠道服务产品数据
     * @author linfeng
     * @since 2019/11/12
     **/
    void insertChannelServProduct(ChannelServProduct channelServProduct);

    /**
     * 描述: 批量新增渠道服务产品数据
     *
     * @param channelServProductList 渠道服务产品数据
     * @author linfeng
     * @since 2019/11/12
     **/
    void insertChannelServProductBatch(@Param("channelServProductList") List<ChannelServProduct> channelServProductList);

    /**
     * 描述: 根据渠道id删除
     *
     * @param channelId 渠道id
     * @return java.lang.Integer
     * @author guoqiao
     * @since 2021/6/9 14:27
     */
    Integer deleteByChannelId(Integer channelId);

    /**
     * 描述: 从旧渠道复制到新渠道
     *
     * @param originalChannelId 原渠道ID
     * @param targetChannelId 新渠道ID
     * @param operator 操作者
     * @return java.lang.Boolean
     * @author guoqiao
     * @since 2021/6/8 13:49
     */
    void copy(Integer originalChannelId, int targetChannelId, String operator);
}
